//
//  QR_CodeViewController.m
//  QuickCare
//
//  Created by 唐润欣 on 16/7/11.
//  Copyright © 2016年 lidabiao. All rights reserved.
//

#import "QR_CodeViewController.h"
#import "CALayer+ZUtility.h"
#import <AVFoundation/AVFoundation.h>

@interface QR_CodeViewController () <AVCaptureMetadataOutputObjectsDelegate>

@property (nonatomic, strong)AVCaptureSession *session;

@end

@implementation QR_CodeViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    /**
     *  输入端 (Input , Device)
     *  @param 摄像头 (数据捕获, Capture)
     *  @param AVCaptureDevice 表示 捕获设备 (摄像头, 录音器)
     */
    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    
    /**
     *  输入
     * AVCaptureInput 获取数据输入端的基类
     * AVCaptureDeviceInput 从指定设备上捕获数据的输入端
     * 将 摄像头 与 输入端 做绑定
     */
    NSError *error;
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
    if (error) {
        
        NSLog(@"输入端创建失败");
        return;
    }
    
    /**
     * 会话 (Session, 协调输入与输出)
     * AVCaptureSession 表示数据捕获的会话
     */
    self.session = [[AVCaptureSession alloc]init];
    
    // 将输入端添加到会话中
    if ([self.session canAddInput:input]) {
        
        [self.session addInput:input];
    }
    
    /**
     * 预览图层
     * AVCaptureVideoPreviewLayer 表示 预览图层
     */
    AVCaptureVideoPreviewLayer *previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
    // 配置frame值
    [previewLayer setFrame:self.view.bounds];
    [self.view.layer addSublayer:previewLayer];
    
    /**
     * 输出端 (Output , 数据处理(判断有没有二维码))
     * AVCaptureOutput 输出端的基类
     * AVCaptureMetadataOutput 用来处理元数据的输出端
     */
    AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc]init];
    // 将输出端添加到会话中
    if ([self.session canAddOutput:output]) {
        
        [self.session addOutput:output];
    }
    // 1. 配置代理, 执行的线程
    [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
    // 2. 设置需要处理的数据类型 (二维码)
    output.metadataObjectTypes = @[@"org.iso.QRCode"];
    
    // 有效的扫描范围为正中间, 大小为 300 * 300
    CGFloat x = ((kScreenWidth - 300) / 2) / kScreenWidth;
    CGFloat y = ((kScreenHeight - 300) / 2) / kScreenHeight;
    CGFloat w = 300 / kScreenWidth;
    CGFloat h = 300 / kScreenHeight;
    
    /**
     *  3. 指定有效的扫描范围
     *  参数类型是CGRect, 默认值是 (0,0,1,1), 每一个值的范围是 0~1
     *  参数的第一个值是一个百分比值
     *  参数的写法: y, x, height, width
     */
    output.rectOfInterest = CGRectMake(x, y, h, w);
    
    
    [self.view.layer coverButRect:CGRectMake((kScreenWidth - 300) / 2, (kScreenHeight - 300) / 2, 300, 300)];
    
    // 让Session启动工作
    [self.session startRunning];
}

// 输出端捕获到需要解析的数据时, 触发代理
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{
    
    // 在扫描到二维码的数据后, 可以将Session停止
    [self.session stopRunning];
}

@end
